package cn.wolfcode.luowowo.redis.srevice.impl;

import cn.wolfcode.luowowo.domain.UserInfo;
import cn.wolfcode.luowowo.redis.AccessVo;
import cn.wolfcode.luowowo.redis.RedisKey;
import cn.wolfcode.luowowo.redis.srevice.IUserRedisSrevice;
import cn.wolfcode.luowowo.service.IUserInfoService;
import cn.wolfcode.luowowo.util.Consts;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class UserRedisServiceImpl implements IUserRedisSrevice {
    
    //导入redis设置
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private IUserInfoService userInfoService;
    
    @Override
    public void setVerifyCode(String phone, String code) {
        //给手机号加上一个前缀  用于分辨缓存中的数据是什么方面的
        /*phone = "VERIFICATION"+phone;*/
        //用枚举的方式给用户加上一个key的前缀
        String key = RedisKey.VERIFY_CODE.join(phone);
        /*设置验证码的存活时间 第一个参数是key 手机号,第二个参数是验证码,第三个是存活的时间,第四个是时间类型*/
        redisTemplate.opsForValue().set(key, code, RedisKey.VERIFY_CODE.getTime(), TimeUnit.SECONDS);
    }
    
    //判断验证码的正确性
    @Override
    public boolean getVerifyCode(String newCode, String phone) {
        /*判断新的验证码是否被为空*/
        //根据新传入的验证码进行判断是否验证码一致 手机号也要带上,根据手机号k获取redis中对应的v
        //用枚举的方式给用户加上一个key的前缀
        String key = RedisKey.VERIFY_CODE.join(phone);
        System.out.println(key);
        //根据手机号作为k去获取对应的v
        String code = redisTemplate.opsForValue().get(key);
        System.out.println(code);
        System.out.println("查询结果是否正确:" + newCode.equals(code));
        //将结果返回
        return newCode.equals(code);
    }
    
    //将数据存进redis 设置一个uuid作为唯一的key
    @Override
    public String getUserKey(UserInfo user) {
        /*用uuid写一个唯一的key */
        //为key值添加特别的前缀,方便后面进行分辨
        String key = RedisKey.USER_KEY.join(UUID.randomUUID().toString().replaceAll("-", ""));
        /*将对象信息存进redis中,但是对象信息是一个对象,需要转换一些才能存进去,所以用的是JSON的toString方法
         * 另外还有就是redis里面数据的有效时间
         * key:     唯一的key
         * value:   用户的信息
         * long;    有效时间30分钟*60
         * time;    时间类型秒
         * */
        redisTemplate.opsForValue().set(
                key,
                JSON.toJSONString(user),
                RedisKey.USER_KEY.getTime(),
                TimeUnit.SECONDS);
        /*返回存好的key*/
        return key;
    }
    
    @Override
    public UserInfo judgeUserByKey(String token) {
        /*首先判断用户的key是否为空,为空就不做任何动作*/
        if (!StringUtils.hasLength(token)) {
            return null;
        }
        /*请求头中的token是没有带前缀的,所以最好就是加上前缀*/
        //String key = RedisKey.USER_KEY.join(token);
        /*用key去判断redis是否存在数据*/
        if (redisTemplate.hasKey(token)) {
            /*存在数据的话 将他取出*/
            String userinfo = redisTemplate.opsForValue().get(token);
            /*保险一点再判空一次*/
            if (StringUtils.hasLength(userinfo)) {
                /*有值的情况下 将redis中的json数据封装进对应的类中,这样方便返回*/
                UserInfo user = JSON.parseObject(userinfo, UserInfo.class);
                /*同时将时间重置为30分钟*/
                redisTemplate.expire(token, RedisKey.USER_KEY.getTime(), TimeUnit.SECONDS);
                return user;
            }
        }
        
        return null;
    }
    
    //存放用户信息
    @Override
    public void setAccessUser(UserInfo userInfo, String user) {
        
        
        String key = RedisKey.USER_ACCESS_KEY.join(user);
        
        //增加
        redisTemplate.opsForValue().set(key, JSON.toJSONString(userInfo));
        //取出
        
        String s = redisTemplate.opsForValue().get(key);
    
        UserInfo userInfo1 = JSON.parseObject(s, UserInfo.class);
    
    
        AccessVo accessVo = new AccessVo();
        String id = userInfo.getId();
        List<String> id1 = accessVo.getId();
        id1.add(id);
        if (user != null) {
            String userKey = RedisKey.USER_ACCESS_KEY.join(user);
            //访客数据存储
            redisTemplate.opsForValue().set(userKey, JSON.toJSONString(accessVo.getId()));
        }
        
        
    }
    
    @Override
    public List<UserInfo> getAccess(String user) {
        List<UserInfo> userInfos = new ArrayList<>();
        //获取
        List<String> id = new ArrayList<>();
        String userKey = RedisKey.USER_ACCESS_KEY.join(user);
        
        String userid = redisTemplate.opsForValue().get(userKey);
//            UserInfo userInfo = JSONArray.parseObject(userinfo, UserInfo.class);
        UserInfo userInfo = userInfoService.get(userid);
        userInfos.add(userInfo);
        
        return userInfos;
    }
    
    @Override
    public String getTotalView(String user) {
        return null;
    }
}
